﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ComunesMGI.DataTypes;
using ClienteWinMGI.Logica;
using ComunesMGI.Controles;
using ComunesMGI.Mensajes;
using System.IO;
using ComunesMGI.Condiciones;
using ComunesMGI.Enums;

namespace ClienteWinMGI.Presentacion
{
    public partial class AltaTarea : Form
    {
        private List<DataSistema> _sistemasDeCliente;
        private List<DataCliente> _clientes;
        private List<DataIncidente> _incidentes;
        private TablaCamposControl _tablaCampos;
        private bool _modoModificar;
        private DataTareaConCampos _tareaModificar;
        private int _sistemaTareaModificar;

        public AltaTarea()
        {
            InitializeComponent();
            try
            {
                _modoModificar = false;
                cargarClientes();
                hideLoader();
            }
            catch (System.Exception ex)
            {

                MsgError err = new MsgError("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        public AltaTarea(int idTarea, int idSistema, bool visualizar)
        {
            InitializeComponent();
            try
            {
                _modoModificar = true;
                hideLoader();

                groupBoxBasicos.Hide();
                System.Windows.Forms.RowStyle small = new RowStyle(SizeType.Absolute, 0);
                tableLayoutPanel1.RowStyles[tableLayoutPanel1.GetRow(groupBoxBasicos)] = small;

                IIncidentes il = LogicaFactory.getInstance().getIIncidentes();
                _tareaModificar = il.GetTarea(idTarea, idSistema);
                if(visualizar)
                    this.Text = "Visualizar Tarea \"" + _tareaModificar.Descripcion + "\"";
                else
                    this.Text = "Modificar Tarea \"" + _tareaModificar.Descripcion + "\"";
                _sistemaTareaModificar = idSistema;

                if (_tablaCampos != null)
                    _tablaCampos.Dispose();

                _tablaCampos = new TablaCamposControl(_tareaModificar.Campos, errorProvider1,visualizar);
                groupBoxExtras.Controls.Add(_tablaCampos);
                if (visualizar)
                    buttonImpact.Visible = false;
                else
                    buttonImpact.Enabled = true;
            }

            catch (System.Exception ex)
            {
                MsgError err = new MsgError("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        private void showLoader()
        {
            picLoader.Visible = true;
        }
        private void hideLoader()
        {
            picLoader.Visible = false;
        }

        private void cargarClientes()
        {
            List<DataCliente> ldc;
            IClientes il = LogicaFactory.getInstance().getIClientes();
            ldc = il.GetClientes();
            comboBoxClientes.Items.Clear();
            if (ldc.Count > 0)
            {
                comboBoxClientes.Items.Clear();
                foreach (DataCliente dc in ldc)
                {
                    comboBoxClientes.Items.Add(dc.Nombre);
                }
                _clientes = ldc;
            }

        }

        private void cargarIncidentes(DataSistema sistema)
        {
            List<DataIncidente> ldi;
            IIncidentes ii = LogicaFactory.getInstance().getIIncidentes();
            List<Condicion> condiciones = new List<Condicion>();
            condiciones.Add(new Condicion(ComunesMGI.Enums.OperadorLogico.Distinto, "Estado", false, "Cerrado", CampoSharepoint.Choice));
            ldi = ii.GetIncidentes(sistema.Codigo, condiciones);

            comboBoxIncidentes.Items.Clear();
            comboBoxIncidentes.Enabled = false;

            if (ldi.Count > 0)
            {
                foreach (DataIncidente di in ldi)
                {
                    string inc = "Id=" + di.IdIncidente + ";" + "Desc=" + di.Descripcion;
                    comboBoxIncidentes.Items.Add(inc);
                }
                _incidentes = ldi;
                comboBoxIncidentes.Enabled = true;
            }

        }

        private void comboBoxClientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cargarSistemas(_clientes.First(dc => dc.Nombre == comboBoxClientes.SelectedItem.ToString()));
            }
            catch (System.Exception ex)
            {
                MsgError err = new MsgError("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        private void buttonImpact_Click(object sender, EventArgs e)
        {
            try
            {
                showLoader();
                this.ValidateChildren();
                if (_tablaCampos.ValidarCampos())
                {
                    DataAltaTarea dai = null;
                    IIncidentes ii = LogicaFactory.getInstance().getIIncidentes();
                    DataSistema actualDs = null;
                    int idIncidente = 0;
                    if (!_modoModificar)
                    {
                        actualDs = _sistemasDeCliente.First(ds => ds.Nombre == comboBoxSistemas.SelectedItem.ToString());
                        actualDs.Campos = _tablaCampos.GetCampos();

                        string datoIncidente = comboBoxIncidentes.SelectedItem.ToString();
                        char[] delimitador = { '=', ';' };
                        string[] palabras = datoIncidente.Split(delimitador);
                        idIncidente = int.Parse(palabras[1]);
                    }

                    if (_modoModificar)
                    {
                        _tareaModificar.Campos = _tablaCampos.GetCampos();
                        ii.ModificarTarea(_sistemaTareaModificar, _tareaModificar);
                        dai = null;
                    }
                    else
                        dai = ii.AddTarea(actualDs.Codigo, idIncidente, actualDs.Campos);

                    if (dai != null || _modoModificar)
                    {
                        MsgNotificacion notif = null;
                        if (_modoModificar)
                            notif = new MsgNotificacion("Tarea Modificada", "Se ha modificado correctamente la tarea", "La se modificá la tarea con identificador= " + _tareaModificar.IdTarea  + ".");
                        else
                            notif = new MsgNotificacion("Nueva Tarea Creada", "Se ha creado correctamente la nueva tarea", "La tarea se creo con identificador= " + dai.IdTarea + " y URL= " + dai.Url);
                        notif.ShowDialog();
                    }
                    this.Close();
                    hideLoader();
                }
            }
            catch (System.Exception ex)
            {
                hideLoader();
                MsgError err = new MsgError("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }
        }

        private void buttonExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        private void comboBoxSistemas_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cargarIncidentes(_sistemasDeCliente.First(ds => ds.Nombre == comboBoxSistemas.SelectedItem.ToString()));
            }
            catch (System.Exception ex)
            {
                MsgError err = new MsgError("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }

        }

        private void cargarSistemas(DataCliente cliente)
        {
            List<DataSistema> lds;
            ISistemas il = LogicaFactory.getInstance().getISistemas();
            lds = il.GetSistemas(cliente.Codigo);
            comboBoxSistemas.Items.Clear();
            comboBoxSistemas.Enabled = false;
            if (lds.Count > 0)
            {
                foreach (DataSistema ds in lds)
                {
                    comboBoxSistemas.Items.Add(ds.Nombre);
                }
                _sistemasDeCliente = lds;
                comboBoxSistemas.Enabled = true;
            }


        }

        private void comboBoxIncidentes_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                DataSistema actualDs = _sistemasDeCliente.First(ds => ds.Nombre == comboBoxSistemas.SelectedItem.ToString());
                IIncidentes il = LogicaFactory.getInstance().getIIncidentes();
                List<DataCampo> dataCampos = il.GetCampos(actualDs.Codigo, ComunesMGI.Enums.Lista.Tareas);
                _tablaCampos = new TablaCamposControl(dataCampos, errorProvider1,false);
                groupBoxExtras.Controls.Add(_tablaCampos);
                buttonImpact.Enabled = true;
            }
            catch (System.Exception ex)
            {
                MsgError err = new MsgError("Error", "Ha ocurrido un error inesperado.", ex.Message);
                err.ShowDialog();
            }

        }
    }
}
